package org.dubnation.user.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.dubnation.auth.domain.SysWebLogin;
import org.dubnation.auth.domain.vo.LoginVO;
import org.dubnation.base.config.RedisConfig;
import org.dubnation.base.enums.ResponseCode;
import org.dubnation.base.util.AjaxResult;
import org.dubnation.base.util.HttpUtil;
import org.dubnation.base.util.audit.DubnationAssert;
import org.dubnation.user.domain.LoginInfo;
import org.dubnation.user.domain.WxUser;
import org.dubnation.user.mapper.LoginInfoMapper;
import org.dubnation.user.mapper.WxUserMapper;
import org.dubnation.user.service.IWxUserService;
import org.dubnation.base.service.impl.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author zhu
 * @since 2023-11-09
 */
@Service
public class WxUserServiceImpl extends BaseServiceImpl<WxUser> implements IWxUserService {

    @Value("${wx.appId}")
    private String appId;
    @Value("${wx.appSecret}")
    private String appSecret;

    @Autowired(required = false)
    private WxUserMapper wxUserMapper;

    @Autowired(required = false)
    private LoginInfoMapper loginInfoMapper;

    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;

    @Autowired
    private LoginVO loginVO;

    @Autowired
    private SysWebLogin sysWebLogin;
    /**
     * 通过code获取access_token
     * @param code
     */
    /*
     * 1.根据openid(授权用户唯一标识)判断当前用户是否是第一次登录-->查询t_wxuser
     * 2.查询为null(当前的微信是第一次登录)-->跳转到绑定页面
     *      2.1 填写手机号-->给手机号发送一个验证码
     *      2.2 提交手机号和验证码
     *      2.3 提交的手机号没有使用过系统
     *          2.3.1 生成t_user_user以及t_user_logininfo的数据
     *          2.3.2 生成t_wxuser(获取微信的个人信息)
     *          2.3.3 做免密登录-->和以前的账号登录流程一致[后台要生成token存放到redis，并返回token，前端存储token]
     *      2.4 提交的手机号是一个老用户
     *          2.4.1 生成t_wxuser(获取微信的个人信息)
     *          2.4.2 和t_user_user关联
     *          2.4.3 做免密登录-->和以前的账号登录流程一致[后台要生成token存放到redis，并返回token，前端存储token]
     * 3.查询不为null(不是第一次登录)
     *      3.1 查询微信用户关联的t_user_user以及对应t_user_logininfo的数据
     *      3.2 做免密登录
     * */
    @Override
    public AjaxResult wxLogin(String code) {
        //1.验证参数code是否为null
        DubnationAssert.isNotNull(code, ResponseCode.RESPONSE_CODE_400);
        //2.发送请求获取access_token
        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appId+"&secret="+appSecret+"&code="+code+"&grant_type=authorization_code";
        String result = HttpUtil.httpGet(url);
        //3.解析获取openid(授权用户唯一标识)
        JSONObject jsonObject = JSON.parseObject(result);
        String openid = jsonObject.get("openid").toString();
        //根据openid判断用户是否登录过
        WxUser wxUser = wxUserMapper.queryByOpenid(openid);
        if (Objects.isNull(wxUser)){
            //没有登录过
            //跳转到绑定页面，绑定手机号
            Map<String, Object> map = new HashMap<>();
            map.put("bindurl", "/binder.html");
            redisTemplate.opsForValue().set(code, result, 2, TimeUnit.HOURS); //一个code只能使用一次用来发送请求，将通过code获取的结果存储到redis中
            //TODO 可能需要添加内容
            return AjaxResult.me().setData(map);
        }else {
            //登录过
            //查询对应用户的t_user_logininfo做免密登录
            LoginInfo loginInfo = loginInfoMapper.queryByUserId(wxUser.getUserId());
            String token = UUID.randomUUID().toString().replace("-", "");
            redisTemplate.opsForValue().set(token, loginInfo);
            loginVO.setToken(token);
            sysWebLogin.setUsername(loginInfo.getUsername());
            sysWebLogin.setEmail(loginInfo.getEmail());
            sysWebLogin.setPhone(loginInfo.getPhone());
            loginVO.setSysWebLogin(sysWebLogin);
            return AjaxResult.me().setData(loginVO);
        }
    }
}
